﻿// using System;
// using System.Collections.Generic;
// using System.Linq;
// using System.Reflection;
// using System.Text;
// using System.Threading.Tasks;
//
// namespace com.susi.util.toolkit
// {
//     [Obsolete("无法保证Invoke不被错误调用、防闭包是脱裤子放屁")]
//     /// <summary>
//     /// 非线程安全
//     /// 非弱事件 - 务必适当时候Dispose
//     /// </summary>
//     /// <typeparam name="T"></typeparam>
//     public struct ActionEvent<T> : IDisposable
//     {
//         private event Action onActionEvent;
//         private event Action<T> onActionTEvent;
//
//         public void Add(Action ac) => onActionEvent += ac;
//         public void Add(Action<T> ac) => onActionTEvent += ac;
//         public void Remove(Action ac) => onActionEvent -= ac;
//         public void Remove(Action<T> ac) => onActionTEvent -= ac;
//
//         public void Clear()
//         {
//             onActionEvent = null;
//             onActionTEvent = null;
//         }
//         public void Invoke(T v)
//         {
//             onActionEvent?.Invoke();
//             onActionTEvent?.Invoke(v);
//         }
//         public void Dispose()
//         {
//             Clear();
//         }
//     }
// }
//
// /// <summary>
// /// Q：为什么不添加弱事件
// /// A：任何需要弱事件的订阅者依赖了事件源的管理机制，破坏了对象封装独立性，移植到其他地方会隐藏问题。
// /// Q：哪里会发生线程问题？
// /// A：event?.Invoke()，问号判空处不能保证线程安全。如果是在判空之后Invok之前订阅消息，那么不能保证收到这个消息
// /// Q：线程安全弱事件怎么实现较好？
// /// A：建议用反射调用方式，而不用事件机制。
// /// Q：ActionEvent使用建议？
// /// A：每个ActionEvent在每个类的Dispose方法里进行Clear，预防泄露
// /// by susi
// /// </summary>
// namespace com.susi.util.toolkit
// {
//     /// <summary>
//     /// 非线程安全
//     /// 非弱事件
//     /// </summary>
//     /// <typeparam name="T"></typeparam>
//     public struct ActionEvent<T, T1>
//     {
//         public event Action onActionEvent;
//         public event Action<T> onActionTEvent;
//         public event Action<T, T1> onActionT1Event;
//
//         public void Add(Action ac) => onActionEvent += ac;
//         public void Add(Action<T> ac) => onActionTEvent += ac;
//         public void Add(Action<T, T1> ac) => onActionT1Event += ac;
//         public void Remove(Action ac) => onActionEvent -= ac;
//         public void Remove(Action<T> ac) => onActionTEvent -= ac;
//         public void Remove(Action<T, T1> ac) => onActionT1Event -= ac;
//
//         public void Clear()
//         {
//             onActionEvent = null;
//             onActionTEvent = null;
//             onActionT1Event = null;
//         }
//         public void Invoke(T v, T1 v1)
//         {
//             onActionEvent?.Invoke();
//             onActionTEvent?.Invoke(v);
//             onActionT1Event?.Invoke(v, v1);
//         }
//     }
//     /// <summary>
//     /// 线程安全
//     /// 非弱事件
//     /// </summary>
//     /// <typeparam name="T"></typeparam>
//     public struct SafeActionEvent<T>
//     {
//         private event Action onActionEvent;
//         private event Action<T> onActionTEvent;
//         //事件的Add和Remove本身是线程安全的
//         public void Add(Action ac) => onActionEvent += ac;
//         public void Add(Action<T> ac) => onActionTEvent += ac;
//         public void Remove(Action ac) => onActionEvent -= ac;
//         public void Remove(Action<T> ac) => onActionTEvent -= ac;
//
//         public void Clear()
//         {
//             onActionEvent = null;
//             onActionTEvent = null;
//         }
//         public void Invoke(T v)
//         {
//             lock (onActionEvent)
//             {
//                 onActionEvent?.Invoke();
//             }
//             lock (onActionTEvent)
//             {
//                 onActionTEvent?.Invoke(v);
//             }
//         }
//     }
// }
